package dm.ast;

import test.envset.GlobalState;

public abstract class DmASTNode {
	int dep_t = 0; // AST的深度
	int wid_t = 0; // AST的宽度
	int target_dep = 1; // 预期深度
	int target_wid = 1; // 预期宽度
	public boolean isCompleted = false; // 完成标志, 表示该部分可以直接转化为spol语句的一部分
	public boolean isLeaf = false; // 该节点是否可以作为叶子节点
	int sel_level = 0; // 查询层级

	public int getWidt() {
		return wid_t;
	}

	public int getDept() {
		return dep_t;
	}

	public int targetWidt() {
		return target_wid;
	}

	public int targetDept() {
		return target_dep;
	}

	public void setTargetWidt(int targetW) {
		target_wid = targetW;
	}

	public void setTargetDept(int targetD) {
		target_dep = targetD;
	}

	public void setASTLevel(int level) {
		sel_level = level;
	}

	public int getSelLevel() {
		return sel_level;
	}

	// 设置该节点的复杂度
	public void setComplexity() {
		setWidt();
		setDept();
	}

	// 需要实现填充,利用元数据完成节点生成
	public abstract void fill(GlobalState globalState);

	// 需要实现wid_t 与 dep_t的计算设置
	public abstract void setWidt();
	public abstract void setDept();

	// 表达式类型
	public abstract DmDataType getExpressionType();

	// 转化为字符串形式
	public String toSql() {
		return " " + this.getClass().getSimpleName() + getSqlTarget();
	}

	public String getSqlTarget() {
		return String.format("/*w:%d,d:%d,l:%d*/", target_wid, target_dep, sel_level);
	}

	public String getSqlComplexity() {
		return String.format("/*w:%d,d:%d*/", wid_t, dep_t);
	}

	public static String stringClose(String str) {
	return String. format("(%s)", str);
	}

	public String toSqlClose() {
		if (target_wid == 1) {
			return toSql();
		} else {
			return stringClose(toSql());
		}
		
	}
}

